<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>HTML文档类型</title>
<link rel="stylesheet" href="../css/reset.css" type="text/css" />
<link rel="stylesheet" href="../css/prettify.css" type="text/css" />
<script type="text/javascript" src="../js/prettify.js"></script>
</head>

<body onload="prettyPrint()">
<h1>WP在主题中注册一个菜单（设置主题中不同位置处的菜单）</h1>
<hr />
<p>要将某个特定的菜单添加到主题中的某个位置，需要将该菜单登记进去。否则，我们就不知道哪个菜单应该在哪个位置上出现。该函数有两种使用方式：</p>
<ul>
	<li>register_nav_menu(): 注册一个单一的菜单位置。</li>
	<li>register_nav_menus(): 注册多个菜单位置。</li>
</ul>
<p>在下面的例子中，我们将在主题的functions.php函数中注册一个称为<em>Primary Menu</em>的菜单</p>
<pre class="prettyprint linenums">
add_action( 'init', 'register_my_menu' );
	function register_my_menu() {
	register_nav_menu( 'primary-menu', __( 'Primary Menu' ) );
	}</pre>
<p>"primary-menu"是我们在代码中用于标识该菜单的别名。"Primary Menu"是我们在控制面板中用于标识该菜单的标签。</p>
<p>当然，我们也可以利用类似的方式注册多个菜单。</p>
<pre class="prettyprint linenums">
add_action( 'init', 'register_my_menus' );
	function register_my_menus() {
	register_nav_menus(
	array(
	'primary-menu' =&gt; __( 'Primary Menu' ),
	'secondary-menu' =&gt; __( 'Secondary Menu' ),
	'tertiary-menu' =&gt; __( 'Tertiary Menu' )
	)
	);
	}</pre>
<h4><a name="show">显示一个导航菜单</a></h4>
<p>有两种方式可用于显示一个导航菜单。一种是在主题模板中调用 <a title="WordPress Codex: wp_nav_menu()" href="http://codex.wordpress.org/Function_Reference/wp_nav_menu">wp_nav_menu()</a> 函数，另一种是使用<em>Navigation Menu</em> 小工具。</p>
<h5>在主题模板中显示一个菜单</h5>
<p>大多数主题都会在 header.php 模板中调用一个导航栏，但是MENUS能够放在主题的任何位置。调用自定义导航菜单的最简单形式为：</p>
<pre class="prettyprint linenums">
&lt;?php wp_nav_menu(); ?&gt;</pre>
<p>该语句将会加载用户创建的菜单或者如果导航菜单不存在的话就调用一个标准的页面列表。</p>
<p>我们可能想对这个调用进行更多的控制。如果从前面提到的 Primary Menu 来调用一个导航菜单，可以这么做：</p>
<pre class="prettyprint linenums">
&lt;?php wp_nav_menu( array( 'theme_location' =&gt; 'primary-menu' ) ); ?&gt;</pre>
<p>你还可以拥有更多的控制权。wp_nav_menu() 函数有几个参数，可以用来对将要显示的菜单进行控制：</p>
<ul>
	<li>theme_location: 调用一个与特定的主题位置相关联的菜单。</li>
	<li>menu: 调用指定ID、别名或名称的菜单。</li>
	<li>container: 封装该菜单的元素。默认是 div，但是如果你使用HTML 5的话，你也可以改为nav。</li>
	<li>container_class: 封装元素的CSS类（指定其显示样式）。</li>
	<li>menu_class: 指定无序列表的CSS类，默认是 menu。</li>
	<li>fallback_cb: 指定不存在菜单项目时要调用的函数。默认情况下会调用wp_list_pages() 函数（WordPress的静态页面列表）。</li>
	<li>before: 要显示在链接文字之前的文字（也是链接的一部分）。</li>
	<li>after: 要显示在链接文字之后的文字（也是链接的一部分）。</li>
	<li>link_before: 要显示在链接前面的文字（不是链接的一部分）。</li>
	<li>link_after: 要显示在链接后面的文字（不是链接的一部分）。</li>
	<li>depth: 指定显示菜单的层次深度，这在定义下拉式菜单的比较有用。默认情况是0（所有层次）。</li>
	<li>walker: 允许自定义一个walker（巡游？）PHP 类来创建菜单。</li>
	<li>echo: 定义是显示该菜单还是仅仅返回数据供PHP程序使用。默认是真，直接显示该菜单。</li>
</ul>
<h5>使用导航菜单微件显示一个菜单</h5>
<p>默认情况下，WordPress 提供了一个简单的菜单微件让我们能够显示选择任何自定义的菜单。你需要的仅仅是一个支持微件的主题（似乎一般的主题都支持微件的吧）。这项使用很简单，就不多介绍了。</p>
<h4><a name="styling">为导航菜单设定样式</a></h4>
<p>这里无法完全教会您如何给一个菜单编写样式，那需要一个完整的CSS教程才能完成。但是一般情况下我们只需要对已有的样式进行修改即可，所以这里给出一些技巧，帮助您修改菜单的CSS样式。</p>
<p>哪里有菜单样式可用？其实很简单。首先，很多主题都已经自带了菜单的样式。其次，如果您看到某个页面上的菜单样式很好看，可以右键单击该页面，选择"查看源文件"，然后找到（可以搜索，Ctrl+F）style.css文件并下载下来就知道它用的是什么样的样式了。</p>
<p>下面让我们来看看一些简单的技巧：</p>
<p>使用 current-menu-item class（CSS类）可以设定当前正在浏览的菜单条目的样式。它让您能够高亮选中读者当前正在浏览的页面对应的导航栏条目。下面是一个示例：</p>
<pre class="prettyprint linenums">
#primary-menu li .current-menu-item a {
	background: #fff url(images/primary-menu-active.png) repeat-x 0 0;
	border-top: none;
	border-bottom: 2px solid #fff;
	}</pre>
<p>您可以以一个很可靠的插件 <a title="Superfish plugin" href="http://users.tpg.com.au/j_birch/plugins/superfish/">Superfish jQuery </a>作为基础。它提供一些细微但很酷的JavaScript功能，还能够修正菜单在Internet Explorer 6中的下拉问题而不需要再去采取别的手段。</p>
<p>到这里，你应该已经了解到处理WordPress中的自定义导航菜单的各方面内容了。不过，下面还有一些更深层次的技巧，也许你也想了解一下。</p>
<h4><a name="functions">一些有用的相关函数</a></h4>
<h5>下拉导航菜单</h5>
<p>假设你希望用户加入条目后该菜单才显示出来。该特性让我们可以使用很多的布局方式。下面的说明让你能够支持最多4种布局方式。</p>
<p>这种设置的关键在于确保系统不会因为没有检测到memus而调用默认的菜单。下面以前面创建的主菜单 (Primary Menu) 为例进行说明。</p>
<pre class="prettyprint linenums">
&lt;?php wp_nav_menu( array( 'theme_location' =&gt; 'primary-menu', 'fallback_cb' =&gt; '' ) ); ?&gt;</pre>
<p>上面的代码告诉WordPress，我们不希望WordPress因为用户没有给菜单添加条目（因而该菜单不会显示）而被回调到任何别的菜单（WordPress默认情况下可能会调用默认的菜单，是不是它觉得你总该有个菜单吧:-)）。</p>
<h5>检查某个主题位置是否存在一个菜单</h5>
<p>WordPress 提供了一个条件函数has_nav_menu() 来检查特定主题位置是否存在一个菜单。假设我们创建了一个容器，其中包含了一个菜单和一个搜索框。但是，如果没有为该位置定义菜单，我们希望这两个东西都不显示出来。也就是说，让这两样东西要么同时出现，要么都不出现。</p>
<p>当你在某个主题位置调用一个菜单时，可以先检查是否有菜单关联到该位置。注意，下面的例子中我们使用菜单别名而不是名称或者ID来进行判断。</p>
<pre class="prettyprint linenums">
&lt;?php if ( has_nav_menu( 'primary-menu' ) ) { ?&gt;
	&lt;div class="nav-container"&gt;
	&lt;?php wp_nav_menu( array( 'theme_location' =&gt; 'primary-menu' ) ); ?&gt;
	&lt;?php get_search_form(); ?&gt;
	&lt;/div&gt;
	} ?&gt;</pre>
<h5>允许更多地菜单容器标签</h5>
<p>默认的菜单系统只允许使用 &lt;div&gt; 和 &lt;nav&gt; 作为菜单容器。这能满足大多数需要。但是，如果因为某些原因，你需要使用别的容器来包含菜单，你可以使用下面的代码来实现。</p>
<pre class="prettyprint linenums">
add_filter( 'wp_nav_menu_container_allowedtags', 'my_menu_allowed_tags' );
	function my_menu_allowed_tags( $tags ) {
	$tags[] = 'p';
	return $tags;
	}</pre>
<p>请注意，这里的 &lt;p&gt; 标签仅仅是个例子，实际上一般不会使用这样的标签来包含一个菜单。</p>
<h5>获取所有主题位置列表</h5>
<p>如果你需要列出主题中所有的菜单位置，需要使用下面的函数。该函数返回一个包含所有位置的数组。</p>
<pre class="prettyprint linenums">
$locations = get_nav_menu_locations();</pre>
<h5>创建一个菜单</h5>
<p>多数主题开发者应该不会使用这样的函数，但是也可能会有需要它的地方。大多数情况下，我们应该使用主题位置定义函数（register_nav_menu()）而不是这个函数。但是，如果你需要通过程序来控制一个菜单的创建，就需要使用 wp_create_nav_menu() 函数了。 
<code> wp_create_nav_menu( 'Menu Name', array( 'slug' =&gt; 'menu-slug' ) );
</pre>
<h5>检查指定的菜单是否存在</h5>
<p>这个函数对主题开发人员可能没什么用，但是迟早还是会用到的。它让你能够通过ID、名称或别名来检查特定的菜单是否存在。</p>
<pre class="prettyprint linenums">
if ( is_nav_menu( 'menu-slug' ) )
	/* 如果该菜单存在则执行…… */
	else
	/* 如果该菜单不存在就执行…… */</pre>
<p>原文链接：<a href="http://justintadlock.com/archives/2010/06/01/goodbye-headaches-hello-menus">http://justintadlock.com/archives/2010/06/01/goodbye-headaches-hello-menus</a></p>
<p>翻译：<a href="http://cnzhx.net/">lonelicloud</a></p>
</body>
</html>
